import dayjs from 'dayjs'

/**
 * 日期时间工具
 */
export const dateUtils = {
  // 格式化日期
  formatDate(date, format = 'YYYY-MM-DD') {
    return dayjs(date).format(format)
  },
  
  // 格式化日期时间
  formatDateTime(date, format = 'YYYY-MM-DD HH:mm:ss') {
    return dayjs(date).format(format)
  },
  
  // 获取今天日期
  today() {
    return dayjs().format('YYYY-MM-DD')
  },
  
  // 获取本月第一天
  monthStart() {
    return dayjs().startOf('month').format('YYYY-MM-DD')
  },
  
  // 获取本月最后一天
  monthEnd() {
    return dayjs().endOf('month').format('YYYY-MM-DD')
  },
  
  // 计算日期差
  diffDays(date1, date2) {
    return dayjs(date1).diff(dayjs(date2), 'day')
  },
  
  // 相对时间
  fromNow(date) {
    return dayjs(date).fromNow()
  }
}

/**
 * 数字工具
 */
export const numberUtils = {
  // 格式化金额
  formatAmount(amount, decimals = 2) {
    if (amount === null || amount === undefined) return '0.00'
    return parseFloat(amount).toFixed(decimals)
  },
  
  // 千分位格式化
  formatThousands(number) {
    return number.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')
  },
  
  // 格式化金额（带千分位）
  formatMoney(amount, decimals = 2) {
    const formatted = this.formatAmount(amount, decimals)
    return this.formatThousands(formatted)
  },
  
  // 生成随机数
  random(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min
  }
}

/**
 * 字符串工具
 */
export const stringUtils = {
  // 检查是否为空
  isEmpty(str) {
    return !str || str.trim() === ''
  },
  
  // 手机号脱敏
  maskPhone(phone) {
    if (!phone) return ''
    return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2')
  },
  
  // 姓名脱敏
  maskName(name) {
    if (!name) return ''
    if (name.length <= 1) return name
    if (name.length === 2) return name[0] + '*'
    return name[0] + '*'.repeat(name.length - 2) + name[name.length - 1]
  },
  
  // 截取字符串
  truncate(str, length = 10, suffix = '...') {
    if (!str) return ''
    return str.length > length ? str.substring(0, length) + suffix : str
  },
  
  // 首字母大写
  capitalize(str) {
    if (!str) return ''
    return str.charAt(0).toUpperCase() + str.slice(1)
  }
}

/**
 * 验证工具
 */
export const validateUtils = {
  // 验证手机号
  isPhone(phone) {
    const phoneRegex = /^1[3-9]\d{9}$/
    return phoneRegex.test(phone)
  },
  
  // 验证邮箱
  isEmail(email) {
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
    return emailRegex.test(email)
  },
  
  // 验证身份证号
  isIdCard(idCard) {
    const idCardRegex = /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/
    return idCardRegex.test(idCard)
  },
  
  // 验证密码强度（至少6位）
  isValidPassword(password) {
    return password && password.length >= 6
  },
  
  // 验证金额
  isValidAmount(amount) {
    const amountRegex = /^\d+(\.\d{1,2})?$/
    return amountRegex.test(amount.toString()) && parseFloat(amount) >= 0
  }
}

/**
 * 存储工具
 */
export const storageUtils = {
  // 设置存储
  set(key, value) {
    try {
      uni.setStorageSync(key, JSON.stringify(value))
    } catch (error) {
      console.error('Storage set error:', error)
    }
  },
  
  // 获取存储
  get(key, defaultValue = null) {
    try {
      const value = uni.getStorageSync(key)
      return value ? JSON.parse(value) : defaultValue
    } catch (error) {
      console.error('Storage get error:', error)
      return defaultValue
    }
  },
  
  // 移除存储
  remove(key) {
    try {
      uni.removeStorageSync(key)
    } catch (error) {
      console.error('Storage remove error:', error)
    }
  },
  
  // 清空存储
  clear() {
    try {
      uni.clearStorageSync()
    } catch (error) {
      console.error('Storage clear error:', error)
    }
  }
}

/**
 * 系统工具
 */
export const systemUtils = {
  // 复制到剪贴板
  copyText(text) {
    return new Promise((resolve, reject) => {
      uni.setClipboardData({
        data: text,
        success: () => {
          uni.showToast({
            title: '复制成功',
            icon: 'success'
          })
          resolve()
        },
        fail: reject
      })
    })
  },
  
  // 拨打电话
  makeCall(phoneNumber) {
    uni.makePhoneCall({
      phoneNumber
    })
  },
  
  // 预览图片
  previewImage(urls, current = 0) {
    uni.previewImage({
      urls,
      current
    })
  },
  
  // 选择图片
  chooseImage(count = 1) {
    return new Promise((resolve, reject) => {
      uni.chooseImage({
        count,
        sizeType: ['original', 'compressed'],
        sourceType: ['album', 'camera'],
        success: resolve,
        fail: reject
      })
    })
  },
  
  // 保存图片到相册
  saveImageToPhotosAlbum(filePath) {
    return new Promise((resolve, reject) => {
      uni.saveImageToPhotosAlbum({
        filePath,
        success: resolve,
        fail: reject
      })
    })
  }
}

/**
 * 权限工具
 */
export const permissionUtils = {
  // 检查用户权限
  hasPermission(permission, userRole = 'employee') {
    const rolePermissions = {
      admin: ['read', 'write', 'delete', 'manage'],
      employee: ['read', 'write']
    }
    
    return rolePermissions[userRole]?.includes(permission) || false
  },
  
  // 检查是否为管理员
  isAdmin(userRole) {
    return userRole === 'admin'
  },
  
  // 检查页面访问权限
  canAccessPage(pagePath, userRole = 'employee') {
    const adminOnlyPages = [
      '/pages/admin/users',
      '/pages/admin/settings',
      '/pages/stats/global'
    ]
    
    if (adminOnlyPages.includes(pagePath)) {
      return this.isAdmin(userRole)
    }
    
    return true
  }
}

/**
 * 业务工具
 */
export const businessUtils = {
  // 客户状态文字
  getCustomerStatusText(status) {
    const statusMap = {
      1: '正常',
      0: '停用'
    }
    return statusMap[status] || '未知'
  },
  
  // 催收状态文字
  getCollectionStatusText(status) {
    const statusMap = {
      'pending': '待处理',
      'processing': '处理中',
      'completed': '已完成',
      'cancelled': '已取消'
    }
    return statusMap[status] || '未知'
  },
  
  // 记账类型文字
  getAccountingTypeText(type) {
    const typeMap = {
      'income': '收入',
      'expense': '支出'
    }
    return typeMap[type] || '未知'
  },
  
  // 用户角色文字
  getUserRoleText(role) {
    const roleMap = {
      'admin': '管理员',
      'employee': '员工'
    }
    return roleMap[role] || '未知'
  }
} 